In [1]:
import pandas as pd
import matplotlib as mpl
import numpy as np
import seaborn as sns 
from matplotlib import pyplot as plt
# %matplotlib inline
In [7]:
stacked_bar_data = pd.read_csv("~/research/scripts/data/input/projects.csv")
stacked_bar_data["total"] = stacked_bar_data.Modules + stacked_bar_data.CoreProjects
#print(stacked_bar_data )
#Set general plot properties
#fig = plt.figure()
plt.figure(1)
sns.set_style("white")
sns.set_context({"figure.figsize": (20, 10)})

N = 20
ind = np.arange(N)    # the x locations for the groups
plt.xticks(ind)

#Plot 1 - background - "total" (top) series
top_plot = sns.barplot(x = stacked_bar_data.Releases, y = stacked_bar_data.total, color = "#0000A3")
## Annotate bars with data points, [:] ==> select everything
for z in top_plot.patches[:]:
    top_plot.annotate(np.round(-z.get_height(),decimals=6),(z.get_x()+z.get_width()/2.,-z.get_height()),ha='center',va='center',xytext=(0,10),textcoords='offset points', color='w')   


#Plot 2 - overlay - "bottom" series
bottom_plot = sns.barplot(x = stacked_bar_data.Releases, y = stacked_bar_data.CoreProjects, color = "red")
## Annotate bars with data points, [:] ==> select everything
for p in bottom_plot.patches[:]:
    bottom_plot.annotate(np.round(p.get_height(),decimals=6),(p.get_x()+p.get_width()/2.,p.get_height()),ha='center',va='center',xytext=(0,-10),textcoords='offset points', color='w')



topbar = plt.Rectangle((0,0),1,1,fc="#0000A3", edgecolor = 'none')
bottombar = plt.Rectangle((0,0),1,1,fc='red',  edgecolor = 'none')
l = plt.legend([topbar,bottombar], ['Modules (sub-Projects)','Core Projects'],loc='upper left', shadow=True, ncol = 1, prop={'size':18})
l.draw_frame(True)


#ax.set(xlim=(-1, 25), ylim=(-1, 800))


plt.xticks(rotation=60)


plt.axis([None, None, None, None])




#Optional code - Make plot look nicer
sns.despine(left=False)
bottom_plot.set_ylabel("Core Projects / Modules (sub-Projects)", fontsize=28)
bottom_plot.set_xlabel("OpenStack Releases", labelpad=28)
#plt.suptitle('Projects and Libraries Managed by Release Team', fontsize=20)


#Set fonts to consistent 16pt size
for item in ([bottom_plot.xaxis.label, bottom_plot.yaxis.label] +
             bottom_plot.get_xticklabels() + bottom_plot.get_yticklabels()):
    item.set_fontsize(28)
 

    
#plt.savefig("releases60.png", bbox_inches='tight')
In [19]:
df = pd.read_csv("./models.csv")
In [20]:
df["strategies"].unique()
Out[20]:
array([' abandoned', ' cycle-with-intermediary', ' cycle-with-milestones',
       ' cycle-trailing', ' untagged', ' cycle-with-rc',
       ' cycle-automatic'], dtype=object)
In [21]:
df["strategies"].describe()
Out[21]:
count                         2875
unique                           7
top        cycle-with-intermediary
freq                          1746
Name: strategies, dtype: object
In [22]:
df["strategies"].value_counts()
Out[22]:
 cycle-with-intermediary    1746
 cycle-trailing              371
 cycle-with-rc               319
 cycle-with-milestones       308
 cycle-automatic              60
 untagged                     52
 abandoned                    19
Name: strategies, dtype: int64
In [23]:
df["releases"].value_counts()
Out[23]:
ussuri         317
train          316
stein          314
victoria       307
rocky          291
queens         259
pike           235
ocata          201
newton         201
mitaka         132
liberty         87
kilo            56
juno            42
icehouse        27
havana          22
independent     19
grizzly         16
folsom          14
essex            7
diablo           4
bexar            3
cactus           3
austin           2
Name: releases, dtype: int64
In [24]:
df1 = df[['delivrables', 'releases', 'strategies']].groupby(['releases', 'strategies']).count()
df1
Out[24]:
delivrables
releases strategies
austin cycle-with-intermediary 1
cycle-with-milestones 1
bexar cycle-with-intermediary 1
cycle-with-milestones 2
cactus cycle-with-intermediary 1
... ... ...
ussuri cycle-with-rc 91
untagged 9
victoria cycle-with-intermediary 213
cycle-with-rc 85
untagged 9

63 rows × 1 columns

In [25]:
####### df1.to_csv("openstack_releases_model.csv")


# # Import Data
# df1 = pd.read_csv("filtered_releases.csv")
# df1['strategies'].describe()
# #df1.to_latex(index=True)
In [ ]:
 
In [28]:
# libraries
import numpy as np
import matplotlib.pyplot as plt

# set width of bar
barWidth = 0.25

# set height of bar
mitaka = [48, 100, 84, 36, 48, 52, 80, 76, 40]
queens = [44, 100, 72, 40, 40, 56, 84, 80, 48]

#bars3 = [29, 3, 24, 25, 17]

# Set position of bar on X axis
r1 = np.arange(len(mitaka))
r2 = [x + barWidth for x in r1]
#r3 = [x + barWidth for x in r2]

# Make the plot
plt.bar(r1, mitaka, color='black', width=barWidth, edgecolor='white', label='Mitaka')
plt.bar(r2, queens, color='red', width=barWidth, edgecolor='white', label='Queens')
#plt.bar(r3, bars3, color='#2d7f5e', width=barWidth, edgecolor='white', label='var3')

# Add xticks on the middle of the group bars
plt.ylabel('% Activities', fontsize='14')
plt.xlabel('Release synchronization activities', fontsize='14') #, fontweight='bold'
plt.xticks([r + barWidth for r in range(len(mitaka))], ['A1.', 'A2.', 
                                                        'A3.', 'A4.', 
                                                        'A5.', 'A6.', 
                                                        'A7.', 'A8.',
                                                        'A9.'], rotation=0)

# Create legend & Show graphic
plt.legend()
plt.savefig("bar_activities.pdf",dpi=120, bbox_inches='tight')
plt.show()

!open .
In [ ]:
 
In [ ]:
# var = df.groupby(['BMI','Gender']).Sales.sum()
# var.unstack().plot(kind='bar',stacked=True,  color=['red','blue'], grid=False)
In [109]:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv("./filtered_releases.csv")
In [114]:
var = df.groupby(['releases','strategies']).deliverables.sum()
var.unstack().plot(kind='bar',stacked=True,  color=['red','blue','grey','green','orange'], grid=False)

plt.yticks(fontsize=18)
plt.xticks(fontsize=22)
plt.xticks(rotation=60)
#plt.axis([-1, 22, -10, 310])

l = plt.legend(loc='upper left', shadow=True, ncol = 1, prop={'size':18})
l.draw_frame(True)


#Optional code - Make plot look nicer
plt.ylabel("#Projects per Release Strategies \n Coordinated by Release team", fontsize=28)
plt.xlabel("OpenStack Releases", fontsize=28)

plt.show()

Release Activities

A1. Release Strategy A2. Planning/Tracking A3. Dependencies A4. Trusted Liaisons A5. Est. Comm. A6. Stabilization A7. Automation A8. Consolidation A9. Stable Maintenance A10. Cycle Highlights
In [2]:
## GNOME 
### !pip install brewer2mpl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings; warnings.filterwarnings(action='once')
from pandas.plotting import parallel_coordinates
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
          'legend.fontsize': med,
          'figure.figsize': (16, 10),
          'axes.labelsize': med,
          'axes.titlesize': med,
          'xtick.labelsize': med,
          'ytick.labelsize': med,
          'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
%matplotlib inline

%matplotlib inline
mpl.rcParams['figure.figsize'] = [12.0, 8.0]

# Version
print(mpl.__version__)  #> 3.0.0
print(sns.__version__)  #> 0.9.0
3.2.2
0.10.1
In [6]:
#### !cat  ~/Desktop/planning_tracking.csv | cut -d':' -f 1 | cut -d'-' -f 2,3 | cut -d'/' -f 2 | tr "-" "," > Gnome_planning_management.csv
# Import Data
## df = pd.read_csv("Gnome_planning_management.csv")
## df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts')
## df1.to_csv("gnome_planned_schedule.csv")

A1. Release Strategies Management

x must have 2 complete cycles requires 60 observations. x only has 23 observation(s)

In [10]:
import statsmodels.api as sm
from collections import Mapping

df = pd.read_csv("./gnome_data/a1.release_strategies.csv") #  planning_frequency.csv a1.planing_tracking_gnome.csv
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [25.0, 10.0]
In [11]:
# Import Data
import numpy as np
import matplotlib as mpl

df = pd.read_csv('./gnome_data/a1.release_strategies.csv') # ./gnome_data/a1.planing_tracking_gnome.csv


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

# Draw Plot
plt.figure(figsize=(12,7), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A1. Release Strategies')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+15, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-35, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-20,200)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# # Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a1.pdf", dpi=120, bbox_inches='tight')
plt.show()

A2. Planning n Tracking

In [12]:
import statsmodels.api as sm
from collections.abc import Mapping

df = pd.read_csv("gnome_data/a2.planing_tracking.csv") #  planning_frequency.csv  a2.planning_frequency.csv
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [25.0, 10.0]
In [13]:
# Import Data
import numpy as np
import matplotlib as mpl

df = pd.read_csv('gnome_data/a2.planing_tracking.csv') # ./gnome_data/a2.planning_frequency.csv


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

# Draw Plot
plt.figure(figsize=(12,7), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A2. Planning & Tracking')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+15, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-35, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-20,200)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# # Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a2.pdf", dpi=120, bbox_inches='tight')
plt.show()
## #Import Data --add this to query ## cat release_model.csv | cut -d':' -f 1 | cut -d'-' -f 2,3 | cut -d'/' -f 2 | tr "-" "," > ## egrep -Ri "release model" release-team ##### df = pd.read_csv("gnome_strategies.csv") ##### df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts') ##### df1.to_csv("gnome_strategies_stats.csv")

A3. Dependency Management

In [14]:
######  Import Data
######  df = pd.read_csv("dependency.csv")
######  df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts')
######  df1.to_csv("a3.dependency.csv")


import statsmodels.api as sm
from collections import Mapping

df = pd.read_csv("gnome_data/a3.dependency.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [15]:
# Prepare Data
df = pd.read_csv("gnome_data/a3.dependency.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A3. Dependency Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-2,350)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a3.pdf", dpi=120, bbox_inches='tight')
plt.show()

A4. Trusted Liaison

$ egrep -Ri 'maintainers' release-team | egrep -v -e "GNOME Gitlab Maintainers <gitlab-issues gnome org>" | egrep -v -e "Maintainers should announce" | egrep -v -e "GNOME Gitlab Maintainers" # #####!open "liaisons.csv" # ### !open "communication.csv" # # ##### Import Data # df = pd.read_csv("liaisons.csv") # df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts') # df1.to_csv("a4.trusted_liaisons.csv") # !open "a4.trusted_liaisons.csv"
In [16]:
import statsmodels.api as sm
import collections.abc
df = pd.read_csv("gnome_data/a4.trusted_liaisons.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [17]:
# Prepare Data
df = pd.read_csv("gnome_data/a4.trusted_liaisons.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A4. Trusted Liaisons')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-2,95)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a4.pdf", dpi=120, bbox_inches='tight')
plt.show()

A5. Communication Channel

#####add this to egrep -Ri 'irc' release-team | egrep -v -e "GnomeIrcChannels" -e "circles in password" -e "circular-chaos" =MONTH(DATEVALUE(B2 & "1")) =DATE(A2,D2,1) ### !open "communication.csv" # ##### Import Data # df = pd.read_csv("communication.csv") # df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts') # df1.to_csv("a5.communication.csv") # !open "a5.communication.csv"
In [18]:
import statsmodels.api as sm
import collections.abc
df = pd.read_csv("gnome_data/a5.communication.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [19]:
# Prepare Data
df = pd.read_csv("gnome_data/a5.communication.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A5. Communication Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-2,60)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a5.pdf", dpi=120, bbox_inches='tight')
plt.show()

A6. Release Stabilization

# ##### Import Data # df = pd.read_csv("stable_release.csv") # df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts') # df1.to_csv("a6.stable.csv")
In [20]:
import statsmodels.api as sm
df = pd.read_csv("gnome_data/a6.stabilization.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [21]:
# Prepare Data

import numpy as np
import matplotlib as mpl

df = pd.read_csv("gnome_data/a6.stabilization.csv")
# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A6. Release Stabilization')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+5, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-5, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-2,150)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a6.pdf", dpi=120, bbox_inches='tight')
plt.show()

A7. Automation and Tooling

In [22]:
import statsmodels.api as sm
df = pd.read_csv("gnome_data/a7.tooling_and_automation.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [23]:
# Prepare Data
df = pd.read_csv("gnome_data/a7.tooling_and_automation.csv")
                


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

# Draw Plot
plt.figure(figsize=(12,5), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A7. Tools & Automation')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+15, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-35, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-5,120)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# # Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a7.pdf", dpi=120, bbox_inches='tight')
plt.show()

A8. Deliverable Consolidating Management

In [24]:
import statsmodels.api as sm
df = pd.read_csv("gnome_data/a8.central_repo.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [25]:
# Prepare Data
df = pd.read_csv("gnome_data/a8.central_repo.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A8. Consolidation Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+5, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-5, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-2,60)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a8.pdf", dpi=120, bbox_inches='tight')
plt.show()

A9. Stable Maintenance

In [26]:
######  Import Data
# df = pd.read_csv("gnome_data/gnome_stable_main.csv")
# df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts')
# df1.to_csv("gnome_data/a9.stsble_m.csv")
In [27]:
import statsmodels.api as sm
df = pd.read_csv("gnome_data/a9.stable_m.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [28]:
# Prepare Data
df = pd.read_csv("gnome_data/a9.stable_m.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A9. Stable Maintenance')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+5, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-5, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-2,210)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a9.pdf", dpi=120, bbox_inches='tight')
plt.show()

A10. Cycle Highlights

release-team/2011-August/msg00027.html:Highlights of this release

In [29]:
# ######  Import Data
# df = pd.read_csv("gnome_data/gnome_cycle.csv")
# df1 = df[['month', 'year']].groupby(['year', 'month']).size().reset_index(name='counts')
# df1.to_csv("gnome_data/a10.gnome_cycle.csv")
In [30]:
import statsmodels.api as sm
df = pd.read_csv("gnome_data/a10.gnome_cycle.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [31]:
# Prepare Data
df = pd.read_csv("gnome_data/a10.gnome_cycle.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A10. Cycle Highlights')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Annotate
# for t, p in zip(trough_locations[1::5], peak_locations[::3]):
#     plt.text(df.timing[p], df.frequency[p]+5, df.timing[p], horizontalalignment='center', color='darkgreen')
#     plt.text(df.timing[t], df.frequency[t]-5, df.timing[t], horizontalalignment='center', color='darkred')

# # Decoration
plt.ylim(-2,105)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)


#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)



plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("gnome_data/a10.pdf", dpi=120, bbox_inches='tight')
plt.show()

Eclipse Rerlease Activities

Data set source: https://www.eclipse.org/lists/platform-releng-dev/index.html

In [32]:
### !pip install brewer2mpl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings; warnings.filterwarnings(action='once')
from pandas.plotting import parallel_coordinates
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
          'legend.fontsize': med,
          'figure.figsize': (16, 10),
          'axes.labelsize': med,
          'axes.titlesize': med,
          'xtick.labelsize': med,
          'ytick.labelsize': med,
          'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
%matplotlib inline

%matplotlib inline
mpl.rcParams['figure.figsize'] = [12.0, 8.0]

# Version
print(mpl.__version__)  #> 3.0.0
print(sns.__version__)  #> 0.9.0
3.2.2
0.10.1

A1. Release Model

In [33]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a1.release_strategy.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [34]:
# Prepare Data
df = pd.read_csv("eclipse_data/a1.release_strategy.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A1. Release Strategy')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,250)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a1.pdf", dpi=120, bbox_inches='tight')
plt.show()

A2. Planning n Tracking

In [35]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a2.tracking_eclipse.csv")

decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [36]:
# Prepare Data
df = pd.read_csv("eclipse_data/a2.tracking_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A2. Planning n Tracking')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,250)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a2.pdf", dpi=120, bbox_inches='tight')
plt.show()

A3. Dependency Management

In [37]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a3.dependency_eclipse.csv")

decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [38]:
# Prepare Data
df = pd.read_csv("eclipse_data/a3.dependency_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A3. Dependency Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,250)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a3.pdf", dpi=120, bbox_inches='tight')
plt.show()

A4. Trusted Liaisons

In [39]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a4.liaisons.csv")

decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [40]:
# Prepare Data
df = pd.read_csv("eclipse_data/a4.liaisons.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A4. Trusted Liaisons')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,110)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a4.pdf", dpi=120, bbox_inches='tight')
plt.show()

A5. Communication Channel

In [41]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a5.comm_eclipse.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [42]:
# Prepare Data
df = pd.read_csv("eclipse_data/a5.comm_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A5. Communication Channel')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,200)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a5.pdf", dpi=120, bbox_inches='tight')
plt.show()

A6. Stabilization

In [43]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a6.stabilization_eclipse.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [44]:
# Prepare Data
df = pd.read_csv("eclipse_data/a6.stabilization_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A6. Stabilization Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,120)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a6.pdf", dpi=120, bbox_inches='tight')
plt.show()

A7. Automation

In [45]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a7.automation.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [46]:
# Prepare Data
df = pd.read_csv("eclipse_data/a7.automation.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A7. Automation Management')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-10,120)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a7.pdf", dpi=120, bbox_inches='tight')
plt.show()

A8. Consolidation

In [47]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a8.consolidation.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [48]:
# Prepare Data
df = pd.read_csv("eclipse_data/a8.consolidation.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A8. Release Consolidation')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-5,165)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a8.pdf", dpi=120, bbox_inches='tight')
plt.show()

A9. Stable Maintenance

In [49]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a9.stable_eclipse.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [50]:
# Prepare Data
df = pd.read_csv("eclipse_data/a9.stable_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A9. Stable Maintenance')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-5,250)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a9.pdf", dpi=120, bbox_inches='tight')
plt.show()

A10. Cycle Highlights

In [51]:
import statsmodels.api as sm
#import collections.abc
from collections import Mapping

df = pd.read_csv("eclipse_data/a10.highligh_eclipse.csv")
decomposition = sm.tsa.seasonal_decompose(df.frequency, model = 'additive', period=30)
fig = decomposition.plot()
mpl.rcParams['figure.figsize'] = [16.0, 10.0]
In [52]:
# Prepare Data
df = pd.read_csv("eclipse_data/a10.highligh_eclipse.csv")
                
import numpy as np
import matplotlib as mpl


# Get the Peaks and Troughs
data = df['frequency'].values
doublediff = np.diff(np.sign(np.diff(data)))
peak_locations = np.where(doublediff == -2)[0] + 1

doublediff2 = np.diff(np.sign(np.diff(-1*data)))
trough_locations = np.where(doublediff2 == -2)[0] + 1

fig, ax = plt.subplots(1,1,figsize=(12,5), dpi= 80)

# Draw Plot
#plt.figure(figsize=(16,10), dpi= 80)
plt.plot('timing', 'frequency', data=df, color='tab:olive', label='A10. Cycle Highlights')
plt.scatter(df.timing[peak_locations], df.frequency[peak_locations], marker=mpl.markers.CARETUPBASE, color='tab:green', s=100, label='Peaks')
plt.scatter(df.timing[trough_locations], df.frequency[trough_locations], marker=mpl.markers.CARETDOWNBASE, color='tab:red', s=100, label='Troughs')

# # Decoration
plt.ylim(-5,150)
xtick_location = df.index.tolist()[::6]
xtick_labels = df.timing.tolist()[::6]
plt.xticks(ticks=xtick_location, labels=xtick_labels, rotation=90, fontsize=12, alpha=.7)
# plt.title("Peak and Troughs of Air Passengers Traffic (1949 - 1969)", fontsize=22)
plt.yticks(fontsize=12, alpha=.7)

# Lighten borders
plt.gca().spines["top"].set_alpha(.0)
plt.gca().spines["bottom"].set_alpha(.3)
plt.gca().spines["right"].set_alpha(.0)
plt.gca().spines["left"].set_alpha(.3)

#ax.set_xticklabels(df['timing'], rotation=90, fontdict={'fontsize':12})
plt.plot(df.index, df['frequency'], c='olive')
plt.plot(decomposition.trend.index, decomposition.trend, c='blue',linewidth=4, markersize=5)

plt.legend(loc='upper left')
plt.grid(axis='y', alpha=.3)
plt.savefig("eclipse_data/a10.pdf", dpi=120, bbox_inches='tight')
plt.show()

Each of the component software products in the GNOME project has its own version number and release schedule.

However, individual module maintainers coordinate their efforts to create a full GNOME stable release on an approximately six-month schedule, alongside its underlying libraries such as GTK and GLib. Some experimental projects are excluded from these releases.

  • GNOME version numbers follow the scheme v.xx.yy. Here, v is a major version, which can include large changes such as ABI breakage; these have no regular schedule and occur in response to requirements for large-scale changes. xx is a minor version, released on the above schedule of approximately every 6 months, in which the 1- or 2-digit number's parity indicates the type of release: if xx is even (e.g. 3.20) the release is considered stable, whereas if xx is odd it represents a current development snapshot (e.g. 3.21) that will eventually evolve into the next stable release. yy indicates a point release, e.g. 3.20.6; these are made on a frequency of weeks in order to fix issues, add non-breaking enhancements, etc.

  • GNOME releases are made to the main FTP server in the form of source code with configure scripts, which are compiled by operating system vendors and integrated with the rest of their systems before distribution. Most vendors only use stable and tested versions of GNOME, and provide it in the form of easily installed, pre-compiled packages. The source code of every stable and development version of GNOME is stored in the GNOME git source code repository. Interested users can always obtain a snapshot of the master development branch or any other branch/tag and build a cutting-edge version for their own use.

  • A number of build-scripts (such as JHBuild or formerly GARNOME) are available to help automate the process of compiling the source code.

In [145]:
 
In [ ]:
 
In [ ]:
 

Zephyr Ecosystem

Release Team Activities: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/contribute/project_roles.html

Release Process

Roadmap and Release Plans

Project roadmaps and release plans are both important tools for the project, but they have very different purposes and should not be confused. A project roadmap communicates the high-level overview of a project’s strategy, while a release plan is a tactical document designed to capture and track the features planned for upcoming releases.

The project roadmap communicates the why; a release plan details the what A release plan spans only a few months; a product roadmap might cover a year or more

Release team:

  • Coordinating Release activites
  • Coordinates X-community collaboration
  • Sets up new projects
  • Coordinates releases
  • Enforces development processes
  • Moderates working groups
  • Oversees relationships with other relevant projects

A1. Release Model

The Zephyr project releases on a time-based cycle, rather than a feature-driven one. Zephyr releases represent an aggregation of the work of many contributors, companies, and individuals from the community.

A time-based release process enables the Zephyr project to provide users with a balance of the latest technologies and features and excellent overall quality. A roughly 3-month release cycle allows the project to coordinate development of the features that have actually been implemented, allowing the project to maintain the quality of the overall release without delays because of one or two features that are not ready yet.

The Zephyr release model is loosely based on the Linux kernel model:

release_cycle.png

Release Procedure

A2. Planing n Tracking

  • Release Plans

The release plan comes into play when the project roadmap’s high-level strategy is translated into an actionable plan built on specific features, enhancements, and fixes that need to go into a specific release or milestone.

The release plan communicates those features and enhancements slated for your project’ next release (or the next few releases). So it acts as more of a project plan, breaking the big ideas down into smaller projects the community and main stakeholders of the project can make progress on.

Items labeled as features are short or long term release items that shall have an assignee and a milestone set.

  • Release Checklist Each release has a GitHub issue associated with it that contains the full checklist. After a release is complete, a checklist for the next release is created.

The following graphic shows the timeline of phases and milestones associated with each release:

milestones.jpg

This shows how the phases and milestones of one release overlap with those of the next release: milestones2.jpg

This section documents the Release manager responsibilities so that it serves as a knowledge repository for Release managers.

Screen%20Shot%202020-07-27%20at%2015.13.43.png

A3. Dependency Management:

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/modules.html#modules

Install Linux Host Dependencies ...e for these Linux distributions: Ubuntu Fedora Clear Linux Arch Linux For distributions that are not based on rolling releases, some of the requirements and dependencies may not be met by your package manager. In that case please follow t...

A4. Trusted Liaisons

  • Collaboration with Module (team) leads: merge all contributions approved by maintainers.

A5. Communication Channel

Communication and Collaboration

The Zephyr project mailing lists are used as the primary communication tool by project members, contributors, and the community. The mailing list is open for topics related to the project and should be used for collaboration among team members working on the same feature or subsystem or for discussing project direction and daily development of the code base. In general, bug reports and issues should be entered and tracked in the bug tracking system (GitHub Issues) and not broadcasted to the mailing list, the same applies to code reviews. Code should be submitted to GitHub using the appropriate tools.

A6. Stabilization

Each release period will consist of a merge window period followed by one or more release candidates on which only stabilization changes, bug fixes, and documentation can be merged in.

Merge window mode: all changes are accepted (subject to approval from the respective maintainers.) When the merge window is closed, the release owner lays a vN-rc1 tag and the tree enters the release candidate phase CI sees the tag, builds and runs tests; QA analyses the report from the build and test run and gives an ACK/NAK to the build The release owner, with QA and any other needed input, determines if the release candidate is a go for release If it is a go for a release, the release owner lays a tag release vN at the same point

A7. Automation

A8. Consolidation

  • Merge Window

A relatively straightforward discipline is followed with regard to the merging of patches for each release. At the beginning of each development cycle, the “merge window” is said to be open. At that time, code which is deemed to be sufficiently stable (and which is accepted by the development community) is merged into the mainline tree. The bulk of changes for a new development cycle (and all of the major changes) will be merged during this time.

  • Tagging Tagging needs to be done via explicit git commands and not via GitHub’s release interface. The GitHub release interface does not generate annotated tags (it generates ‘lightweight’ tags regardless of release or pre-release). You should also upload your gpg public key to your GitHub account, since the instructions below involve creating signed tags. However, if you do not have a gpg public key you can opt to remove the -s option from the commands below.

A9. Stable Maintenance

Stable releases: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/development_process/release_process.html?highlight=stable

[(release branches for maintenance after release tagging.)]

A10. Cycle Highlights :

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/releases/release-notes-2.4.html?highlight=releases

  • What has changed sinece last release?
  • Example:

  • Zephyr 2.4.0 (Working Draft)

  • We are pleased to announce the release of Zephyr RTOS version 2.4.0.

  • Major enhancements with this release include:

  • Moved to using C99 integer types and deprecate Zephyr integer types. The Zephyr types can be enabled by Kconfig DEPRECATED_ZEPHYR_INT_TYPES option.

  • The following sections provide detailed lists of changes by component.

In [ ]:
 
In [ ]: